home *** CD-ROM | disk | FTP | other *** search
/ CD Exchange / CD Exchange - Volume 1.iso / games / pd / chess / src.lha / src / amiga / amiterm.c < prev    next >
C/C++ Source or Header  |  1992-09-06  |  13KB  |  664 lines

  1. /*
  2.  * Amiga curses-style terminal routines.
  3.  * Taken from Amiga ISpell, and hacked to fit GNUCHESS.
  4.  *
  5.  * (C) 1992 Martin W. Scott.
  6.  */
  7. #include <exec/types.h>
  8. #include <exec/memory.h>
  9. #include <intuition/intuition.h>
  10. #include <libraries/gadtools.h>
  11. #include <dos/dos.h>
  12. #include <proto/exec.h>
  13. #include <proto/dos.h>
  14. #include <proto/gadtools.h>
  15. #include <proto/intuition.h>
  16.  
  17. #include <stdio.h>
  18. #include <fcntl.h>
  19. #include <stdarg.h>
  20. #include <ctype.h>
  21.  
  22. #include "display.h"
  23. #include "amiterm.h"
  24. #include "draw.h"
  25. #include "pointer.h"
  26. #include "requester.h"
  27. #include "gnuchess.h"    /* for struct flag definition */
  28.  
  29. /* Prototypes for static functions */
  30. static void CloseLibs(void);
  31. static BOOL OpenLibs(void);
  32. static BOOL Open_Console(struct IOStdReq *rq, struct Window *win);
  33. static void CleanUp(void);
  34. static void putcon(struct IOStdReq *rq, char *str);
  35. static void __stdargs printc(char *fmt, ...);
  36. static void cursor_off(void);
  37. static void cursor_on(void);
  38. static void con_set_line(int offset, int len);
  39. static void con_set_pagelen(void);
  40. static void setcolors(int color);
  41. static void DisableWindow(void);
  42. static void EnableWindow(void);
  43. static void About(void);
  44. static int mousebutton(BOOL down, WORD x, WORD y);
  45. static int menupick(WORD menu, WORD item, WORD subitem);
  46. static int getevent(struct Window *ApplWin);
  47.  
  48. /* special event 'char's */
  49. #define IGNORE_EVENT    -1
  50. #define MOUSE_MOVE    1000
  51. #define MENU_PICK    1001
  52.  
  53. /* libraries */
  54. struct IntuitionBase *IntuitionBase;
  55. struct GadToolsBase *GadToolsBase;
  56. struct GfxBase *GfxBase;
  57. struct Library *ReqToolsBase;
  58.  
  59. /* storage */
  60. static char movestr[6];        /* mousebutton move */
  61. static char *menuchoice;    /* menu => command */
  62. struct RastPort *rp;
  63. static struct IOStdReq *scr_rq = NULL;
  64. static int get_file;        /* next string from filereq */
  65. static char *frhail;        /* hail-text for filereq */
  66. int get_command;        /* use mouse/menus for input */
  67. static char colorfile[100];    /* name of color file */
  68.  
  69.  
  70. /* close libraries that were opened */
  71. static void
  72. CloseLibs()
  73. {
  74.     if (ReqToolsBase) CloseLibrary(ReqToolsBase);
  75.     if (GadToolsBase) CloseLibrary(GadToolsBase);
  76.     if (GfxBase) CloseLibrary(GfxBase);
  77.     if (IntuitionBase) CloseLibrary(IntuitionBase);
  78. }
  79.  
  80. /* open required libraries */
  81. static BOOL
  82. OpenLibs()
  83. {
  84.     if ((IntuitionBase = (void *)OpenLibrary("intuition.library",37L)) &&
  85.         (GfxBase = OpenLibrary("graphics.library", 37L)) &&
  86.         (GadToolsBase =  (void *)OpenLibrary("gadtools.library",37L)))
  87.     {
  88.         ReqToolsBase = (void *)OpenLibrary("reqtools.library", 37L);
  89.         return TRUE;
  90.     }
  91.  
  92.     CloseLibs();
  93.     return FALSE;
  94. }
  95.  
  96. static BOOL
  97. Open_Console(struct IOStdReq *rq, struct Window *win)
  98. {
  99.     rq->io_Data = (APTR) win;
  100.     rq->io_Length = sizeof(struct IOStdReq);
  101.     if (OpenDevice("console.device",0,rq,0))
  102.       return(FALSE);    /* could not get device */      
  103.     return(TRUE);    /* device opened successfully */
  104. }
  105.  
  106. static void
  107. CleanUp()
  108. {
  109.     if (scr_rq)
  110.     {
  111.         if (scr_rq->io_Device) CloseDevice(scr_rq);
  112.         FreeMem(scr_rq, sizeof(struct IOStdReq));
  113.         scr_rq = NULL;
  114.     }
  115.     CloseChessWindow();
  116.     CloseDownScreen();
  117.     CloseLibs();
  118. }
  119.  
  120. void
  121. endwin()
  122. {
  123.     CleanUp();
  124. }
  125.  
  126. int
  127. initscr()
  128. {
  129.     if (!OpenLibs())
  130.         return FALSE;
  131.  
  132.     if (!(scr_rq = AllocMem(sizeof(struct IOStdReq), MEMF_PUBLIC | MEMF_CLEAR)))
  133.     {
  134.         CloseLibs();
  135.         return FALSE;
  136.     }
  137.  
  138.     strcpy(colorfile, libdir);
  139.     AddPart(colorfile, "gnuchess.colors", sizeof(colorfile));
  140.     LoadColors(colorfile);    /* may fail...who cares? */
  141.  
  142.     if ((SetupScreen() == 0) &&
  143.         (OpenChessWindow() == 0) &&
  144.         (Open_Console(scr_rq, ChessWnd)))
  145.     {
  146.         rp = ChessWnd->RPort;
  147.         return TRUE;
  148.     }
  149.     CleanUp();
  150.     return FALSE;
  151.  
  152. } /* initscr */
  153.  
  154.  
  155. /********************************************************************************/
  156. /*    Buffered output routines                        */
  157. /********************************************************************************/
  158.  
  159. #define CONBUFSIZ    128
  160.  
  161. static char putbuf[CONBUFSIZ+1];
  162. static UWORD bufpos;
  163.  
  164. #define putch(ch)    {if (bufpos == CONBUFSIZ) refresh(); putbuf[bufpos++] = (ch);}
  165. #define inst_putch(ch)    putch(ch); refresh()
  166.  
  167. void
  168. refresh()
  169. {
  170.     putbuf[bufpos]='\0';
  171.     putcon(scr_rq, putbuf);
  172.     bufpos=0;
  173.     chkabort();
  174. }
  175.  
  176. void
  177. putstr(char *str)
  178. {
  179.     if (strlen(str) >= (CONBUFSIZ-bufpos))
  180.         refresh();
  181.     while (*str)
  182.         putch(*str++);
  183. }
  184.  
  185. /*******************************************************************************/
  186.  
  187. static void
  188. putcon(struct IOStdReq *rq, char *str)
  189. {
  190.     /* in case the console has not been initialized */
  191.     if ( rq == NULL ) {
  192.         fprintf(stdout,"%s",str);
  193.     return;
  194.     }
  195.     rq->io_Command = CMD_WRITE;
  196.     rq->io_Data = (APTR) str;
  197.     rq->io_Length = -1;    
  198.     DoIO(rq);    
  199. }
  200.  
  201. static void __stdargs
  202. printc(char *fmt, ...)
  203. {
  204.     va_list ap;
  205.     char    pbuff[256];
  206.     va_start(ap,fmt);
  207.     vsprintf(pbuff,fmt,ap);
  208.     putstr(pbuff);
  209. }
  210.  
  211. static void
  212. cursor_off()
  213. {
  214.      printc("%c%c%c%c",0x9b,0x30,0x20,0x70);
  215. }
  216.  
  217. static void
  218. cursor_on()
  219. {
  220.     printc("%c%c%c",0x9b,0x20,0x70);
  221. }
  222.  
  223. static void
  224. con_set_line(int offset,int len)
  225. {
  226.     char buf[10];
  227.     sprintf(buf,"%d",(short)offset);
  228.     printc("%c%s%c",0x9b,buf,0x78);
  229.  
  230.     sprintf(buf,"%d",(short)len);
  231.     printc("%c%s%c",0x9b,buf,0x75);
  232. }
  233.  
  234. static void
  235. con_set_pagelen()
  236. {
  237.     printc("%c%c",0x9b,0x74);
  238. }
  239.  
  240. static void
  241. setcolors(int color)
  242. {
  243.     char buf[100];
  244.     sprintf(buf,"\x9b%dm", color);
  245.     putstr(buf);
  246. }
  247.  
  248. static void
  249. EnableWindow()
  250. {
  251.     struct MenuItem *item;
  252.  
  253.     ModifyIDCMP(ChessWnd, CHESS_IDCMP);
  254.  
  255.     /* update menu toggle status */
  256.     item = ItemAddress(ChessMenus, FULLMENUNUM(TOGGLES, REVERSE, 0));
  257.     if (flag.reverse) item->Flags |= CHECKED;
  258.     else item->Flags &= ~CHECKED;
  259.  
  260.     item = ItemAddress(ChessMenus, FULLMENUNUM(TOGGLES, COORDINATES, 0));
  261.     if (flag.coords) item->Flags |= CHECKED;
  262.     else item->Flags &= ~CHECKED;
  263.  
  264.     item = ItemAddress(ChessMenus, FULLMENUNUM(TOGGLES, THINKING, 0));
  265.     if (flag.post) item->Flags |= CHECKED;
  266.     else item->Flags &= ~CHECKED;
  267.  
  268.     item = ItemAddress(ChessMenus, FULLMENUNUM(TOGGLES, RANDOM, 0));
  269.     if (dither) item->Flags |= CHECKED;
  270.     else item->Flags &= ~CHECKED;
  271.  
  272.     item = ItemAddress(ChessMenus, FULLMENUNUM(TOGGLES, BEEP, 0));
  273.     if (flag.beep) item->Flags |= CHECKED;
  274.     else item->Flags &= ~CHECKED;
  275. /***
  276.     item = ItemAddress(ChessMenus, FULLMENUNUM(TOGGLES, USEBOOK, 0));
  277.     if (Book) item->Flags |= CHECKED;
  278.     else item->Flags &= ~CHECKED;
  279.  NOT WORKING... ***/
  280.  
  281.     SetMenuStrip(ChessWnd, ChessMenus);
  282. }
  283.  
  284. static void
  285. DisableWindow()        /* let user type ahead, but no more */
  286. {
  287.     ClearMenuStrip(ChessWnd);
  288.     ModifyIDCMP(ChessWnd, IDCMP_VANILLAKEY);
  289. }
  290.  
  291. #define ABOUT_TXT_1 "\
  292. Welcome to Amiga GnuChess Version 1.0,\n\
  293. derived from GNU Chess Version 4.00, patchlevel 58.\n\
  294. \n\
  295. GNU Chess is Copyright (c) 1986-1992 Free Software Foundation.\n\
  296. Amiga graphics display is Copyright (c) 1992 Martin W. Scott.\n\
  297. Freely redistributable, subject to the GNU General Public Licence.\n\
  298. "
  299.  
  300. #define ABOUT_TXT_2 "\
  301. You may contact the author of this Amiga port at:\n\
  302. \n\
  303.         Martin W. Scott,\n\
  304.         23, Drum Brae North,\n\
  305.         Edinburgh, EH4 8AT\n\
  306.         United Kingdom.\n\
  307. \n\
  308. This version was released in September of 1992.\n\
  309. Thanks to Nico François for reqtools.library.\
  310. "
  311.  
  312. /* EasyEasyrequest... */
  313. static void
  314. About()
  315. {
  316.     struct EasyStruct es;
  317.     char *arglist[2];
  318.  
  319.     es.es_StructSize = sizeof(struct EasyStruct);
  320.     es.es_Flags = 0L;
  321.     es.es_Title = "About Amiga GnuChess";
  322.     es.es_TextFormat = "%s%s";
  323.     es.es_GadgetFormat = "OK";
  324.     arglist[0] = ABOUT_TXT_1;
  325.     arglist[1] = ABOUT_TXT_2;
  326.     EasyRequestArgs(ChessWnd, &es, NULL, arglist);
  327. }
  328.  
  329. /* convert mouse-event to chess-square string */
  330. /* to do?: erase square and make pointer an image of the piece 'held' */
  331.  
  332. static int
  333. mousebutton(BOOL down, WORD x, WORD y)
  334. {
  335.     static UWORD    from_row, from_col;
  336.     static BOOL    have_from;
  337.     UWORD        row, col;
  338.     int        rv = -1;
  339.  
  340.     row = 7-(y-TOP_OFFSET)/SQUARE_HEIGHT;
  341.     col = (x-LEFT_OFFSET)/SQUARE_WIDTH;
  342.  
  343.     if (!have_from && down)        /* from square selected */
  344.     {
  345.         if (row < 8 && col < 8)
  346.         {
  347.             AmiToggleSquare(row,col);
  348.             from_row = row;
  349.             from_col = col;
  350.             have_from = TRUE;
  351.             SetToPointer(ChessWnd);
  352.         }
  353.          /* else ignore mouse-command */
  354.     }
  355.     else if (have_from)        /* to square selected */
  356.     {
  357.         ClrToPointer(ChessWnd);
  358.         AmiToggleSquare(from_row,from_col);    /* restore from-square */
  359.  
  360.         if ((row < 8 && col < 8) &&            /* in bounds */
  361.             (from_row != row || from_col != co